<?php 
require_once(APPPATH.'classes/forma_pagto.php');
class Empresa extends UDEntity {

	// Auto
	protected $cod_empresa_auto;
	//protected $cod_empresa; // Não usado por enquanto
	protected $data_cadastro;
	protected $empresa_bloqueada;
	protected $data_ativacao;

	// Acesso
	protected $email_empresa;
	protected $senha_empresa;

	// Cadastro geral
	protected $cnpj_empresa;
	protected $cpf_empresa;
	protected $insc_estadual;
	protected $razao_social;
	protected $nome_fantasia;

	// Contato
	protected $site_empresa;
	protected $telefone;
	protected $celular;
	protected $nome_administrador;

	// Endereço
	protected $cod_cidade_auto;
	protected $endereco;
	protected $bairro;
	protected $numero;
	protected $cep;

	// Segmentos
	protected $segmento_principal;
	protected $segmentos;

	protected $formas_pagto;

	//Entrega
	protected $taxa_entrega;

	public function __construct( $idOrEmail = '' ) {
		parent::__construct();

		// Acesso
		$this->email_empresa 		= '';
		$this->senha_empresa 		= '';

		// Cadastro geral
		$this->cnpj_empresa 		= '';
		$this->cpf_empresa 			= '';
		$this->insc_estadual 		= '';
		$this->razao_social 		= '';
		$this->nome_fantasia 		= '';

		// Contato
		$this->site_empresa 		= '';
		$this->telefone 			= '';
		$this->celular 				= '';
		$this->nome_administrador 	= '';

		// Endereço
		$this->cod_cidade_auto      = '';
		$this->endereco 			= '';
		$this->bairro 				= '';
		$this->numero 				= '';
		$this->cep 					= '';

		$this->segmento_principal 	= '';
		$this->segmentos 			= array();
		$this->formas_pagto			= array();

		//Entrega
		$this->taxa_entrega 		= 0;

		//Somente uso sistema
		$this->data_cadastro 		= date('Y-m-d');
		$this->empresa_bloqueada 	= 1;

		if(!empty($idOrEmail)){
			$this->carregar($idOrEmail);
		}
	}

	//
	// Implementação métodos abstratos
	//

	public function carregar($idOrEmail){
		if(is_numeric($idOrEmail)){
			$this->CI->db->where('cod_empresa_auto', $idOrEmail);
		}else{
			$this->CI->db->where('email_empresa', $idOrEmail);	
		}
		
		$query = $this->CI->db->get('empresa');

		if($query && $query->num_rows() == 1){
			foreach ($query->result() as $emp) {
				$this->cod_empresa_auto 	= $emp->cod_empresa_auto;
				$this->email_empresa 		= $emp->email_empresa;
				$this->senha_empresa 		= $emp->senha_empresa;
				$this->cnpj_empresa 		= $emp->cnpj_empresa;
				$this->cpf_empresa 			= $emp->cpf_empresa;
				$this->insc_estadual 		= $emp->insc_estadual;
				$this->razao_social 		= $emp->razao_social;
				$this->nome_fantasia 		= $emp->nome_fantasia;
				$this->site_empresa 		= $emp->site_empresa;
				$this->telefone 			= $emp->telefone;
				$this->celular 				= $emp->celular;
				$this->nome_administrador 	= $emp->nome_administrador;
				$this->cod_cidade_auto 		= $emp->cod_cidade_auto;
				$this->endereco 			= $emp->endereco;
				$this->bairro 				= $emp->bairro;
				$this->numero 				= $emp->numero;
				$this->cep 					= $emp->cep;
				$this->taxa_entrega 		= $emp->taxa_entrega;
				$this->data_cadastro 		= $emp->data_cadastro;
				$this->data_ativacao 		= $emp->data_ativacao;
				$this->empresa_bloqueada 	= $emp->empresa_bloqueada;
			}

			// Segmentos

			$this->CI->db->where('cod_empresa_auto', $this->cod_empresa_auto);
			$query = $this->CI->db->get('segmento_emp');

			if($query && $query->num_rows() > 0){
				foreach($query->result() as $row){
					$segto = new Segmento($row->cod_segmento_auto);

					if(empty($this->segmento_principal)){
						$this->segmento_principal = $segto;
					}else{
						array_push($this->segmentos, $segto);
					}
				}
			}

			// Formas de pagamento aceitas

			$this->CI->db->where('cod_empresa_auto', $this->cod_empresa_auto);
			$query = $this->CI->db->get('forma_pagto_emp');

			if($query && $query->num_rows() > 0){
				foreach($query->result() as $row){
					array_push($this->formas_pagto, new FormaPagto($row->cod_forma_auto));
				}
			}
		}
	}

	public function gravar(){
		$validacao = $this->validar();
		
		if ($validacao[0]){
			if(!empty($this->cod_empresa_auto)){
				//Update
				$data = array(
						'cod_cidade_auto' => $this->getCodCidade(),
						'insc_estadual' => $this->getIE(),
						'razao_social' => $this->getRazaoSocial(),
						'nome_fantasia' => $this->getNomeFantasia(),
						'site_empresa' => $this->getSite(),
						'telefone' => $this->getTelefone(),
						'celular' => $this->getCelular(),
						'nome_administrador' => $this->getAdministrador(),
						'taxa_entrega' => $this->getTaxaEntrega(),
						'endereco' => $this->getEndereco(),
						'numero' => $this->getNumero(),
						'bairro' => $this->getBairro(),
						'cep' => $this->getCEP(),
						'empresa_bloqueada' => $this->isBloqueada(),
						'senha_empresa' => $this->getSenha(),
						'data_ativacao' => $this->data_ativacao
					);

				$this->CI->db->where('cod_empresa_auto', $this->cod_empresa_auto);
				$this->CI->db->update('empresa', $data);
			}else{
				//Insert
				$data = array(
						'cod_cidade_auto' => $this->getCodCidade(),
						'cnpj_empresa' => $this->getCNPJ(),
						'cpf_empresa' => $this->getCPF(),
						'email_empresa' => $this->getEmail(),
						'senha_empresa' => $this->getSenha(),
						'insc_estadual' => $this->getIE(),
						'razao_social' => $this->getRazaoSocial(),
						'nome_fantasia' => $this->getNomeFantasia(),
						'site_empresa' => $this->getSite(),
						'telefone' => $this->getTelefone(),
						'celular' => $this->getCelular(),
						'nome_administrador' => $this->getAdministrador(),
						'taxa_entrega' => $this->getTaxaEntrega(),
						'endereco' => $this->getEndereco(),
						'numero' => $this->getNumero(),
						'bairro' => $this->getBairro(),
						'cep' => $this->getCEP(),
						'data_cadastro' => $this->data_cadastro
					);

				$query = $this->CI->db->insert('empresa', $data);
				$this->cod_empresa_auto = $this->CI->db->insert_id();
				$this->enviarConfirmacao();
			}

			// Salvar segmentos
			$this->CI->db->where('cod_empresa_auto', $this->cod_empresa_auto);
			$this->CI->db->delete('segmento_emp');

			if(!empty($this->segmento_principal)){
				$data = array(
					'cod_empresa_auto' => $this->cod_empresa_auto,
					'cod_segmento_auto' => $this->segmento_principal->getCodSegmento()
				);

				$this->CI->db->insert('segmento_emp', $data);

				foreach($this->segmentos as $segmento){
					$data = array(
						'cod_empresa_auto'  => $this->cod_empresa_auto,
						'cod_segmento_auto' => $segmento->getCodSegmento()
					);

					$this->CI->db->insert('segmento_emp', $data);					
				}
			}

			// Salvar formas pagamento
			$sql = '
				DELETE FROM forma_pagto_emp 
				 WHERE cod_empresa_auto = ? 
				   AND cod_forma_auto NOT IN (
									SELECT DISTINCT fe.cod_forma_auto
									  FROM forma_pagto_emp fe
									 INNER JOIN pedido p ON p.cod_forma_emp_auto = fe.cod_forma_emp_auto
									 WHERE fe.cod_empresa_auto = ?
									)
			';
			$query = $this->CI->db->query($sql, array($this->cod_empresa_auto, $this->cod_empresa_auto));

			foreach($this->formas_pagto as $forma_pagto){

				

				$data = array(
					'cod_empresa_auto' => $this->cod_empresa_auto,
					'cod_forma_auto'   => $forma_pagto->getCodFormaAuto()
				);

				$this->CI->db->insert('forma_pagto_emp', $data);					
			}
		}

		return $validacao;
	}

	public function validar(){
		$validacao = array(true,'');

		if(!empty($this->cod_empresa_auto)){
			//update
		}else{
			//insert
			$this->CI->db->from('empresa');
			$this->CI->db->where('email_empresa', $this->getEmail());
			if($this->CI->db->count_all_results() > 0){
				$validacao = array(false, 'E-mail já cadastrado em nosso sistema.');
			}

	    	$this->CI->db->from('empresa');
			$this->CI->db->where('cnpj_empresa', $this->getCNPJ());
			if($this->CI->db->count_all_results() > 0){
				$validacao = array(false, 'CNPJ já cadastrado em nosso sistema.');
			}
		}

		return $validacao;
	}

	//
	// Métodos próprios
	//

	public function encodePassword($pass){
		$this->CI->load->library('encrypt');
		return $this->CI->encrypt->encode($pass);
	}

	private function decodePassword($pass){
		$this->CI->load->library('encrypt');
		return $this->CI->encrypt->decode($pass);
	}

	public function comparePassword($pwd){
		return $this->decodePassword($this->getSenha()) == $pwd;
	}

	public function enviarConfirmacao(){
		$this->CI->load->helper('text');

        $html_email = ascii_to_entities($this->htmlConfirmacao());

        $this->CI->load->library('email', $this->CI->config->item('ud_emailconfig'));
        $this->CI->email->set_newline('\r\n');
        $this->CI->email->from($this->CI->config->item('ud_emailfromemail'), $this->CI->config->item('ud_emailfromname'));
        $this->CI->email->to($this->getEmail());
        $this->CI->email->subject('Confirmação de Cadastro Universo Delivery');
        $this->CI->email->message($html_email);
        $this->CI->email->send();       
	}

	private function htmlConfirmacao(){
        $this->CI->load->library('encrypt');
        $chave = $this->CI->encrypt->encode($this->cod_empresa_auto);
        
        $html = '';
        $html .= '<table style="width:600px;" cellspacing="0" cellpadding="0">';
        $html .= '  <tr>';
        $html .= '      <td style="width:230px; text-align:left; border-bottom:1px solid #ccc;">';
        $html .= '          <img src="'.base_url('assets/images/logo.png').'" alt="Universo Delivery" />';
        $html .= '      </td>';
        $html .= '      <td style="text-align:left; font-family: Arial, Helvetica, sans-serif; font-size:22px; color:gray; border-bottom:1px solid #ccc;">';
        $html .= '          Confirmação de Cadastro';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2">';
        $html .= '          <div style="font-family: Arial, Helvetica, sans-serif; font-size:12px; padding-top:15px;">';
        $html .= '              Olá,';
        $html .= '              Recebemos seu cadastro no <strong>Universo Delivery</strong>.';
        $html .= br() . br();
        $html .= '              Para confirmá-lo, acesse o endereço abaixo:';
        $html .= '              ';
        $html .= '              <div style="padding:10px; border:1px solid #ccc; word-break:break-all; background:#f0f0f0; margin:10px 0; text-align:center;">';
        $html .= '                  '.anchor('confirmation/ccompany/'.$chave, site_url('confirmation/ccompany/'.$chave));
        $html .= '              </div>';
        $html .= '          </div>';
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '  <tr>';
        $html .= '      <td colspan="2" style="font-size:10px; padding:10px; border-top:1px solid #ccc; font-family:Arial, Helvetica, sans-serif; text-align:center;">';
        $html .= '          <strong>Universo Delivery</strong>, mata a fome rapidinho!';
        $html .= br();
        $html .= anchor('', site_url());
        $html .= '      </td>';
        $html .= '  </tr>';
        $html .= '</table>';

        return $html;
	}

	public function hasID(){
		return !empty($this->cod_empresa_auto) && $this->cod_empresa_auto > 0;
	}

	public function isAtivo(){
		return !empty($this->data_ativacao) && $this->data_ativacao != "0000-00-00";
	}

	public function ativarCadastro(){
		$this->data_ativacao = date('Y-m-d');
	}

	public function isBloqueada(){
		return $this->empresa_bloqueada;
	}

	//
	// Getters e Setters
	//

	public function setEmpresaBloqueada($bloqueada){
		$this->empresa_bloqueada = $bloqueada;
	}

	public function getEmail(){
		return $this->email_empresa;
	}

	public function setEmail($email){
		$this->email_empresa = $email;
	}

	public function getSenha(){
		return $this->senha_empresa;
	}

	public function setSenha($senha){
		$this->senha_empresa = $this->encodePassword($senha);
	}

	public function getCNPJFormatted(){
		return UDUtil::mask(str_pad((string)$this->cnpj_empresa, 14, STR_PAD_LEFT), '##.###.###/####-##');
	}

	public function getCNPJ(){
		return $this->cnpj_empresa;
	}

	public function setCNPJ($cnpj){
		return $this->cnpj_empresa = preg_replace('(\D)', '', $cnpj);
	}

	public function getCPF(){
		return $this->cpf_empresa;
	}

	public function setCPF($cpf){
		return $this->cpf_empresa = $cpf;
	}

	public function getIE(){
		return $this->insc_estadual;
	}

	public function setIE($insc_estadual){
		return $this->insc_estadual = $insc_estadual;
	}

	public function getRazaoSocial(){
		return $this->razao_social;
	}

	public function setRazaoSocial($razao_social){
		return $this->razao_social = $razao_social;
	}
	
	public function getNomeFantasia(){
		return $this->nome_fantasia;
	}

	public function setNomeFantasia($nome_fantasia){
		return $this->nome_fantasia = $nome_fantasia;
	}

	public function getSite(){
		return $this->site_empresa;
	}

	public function setSite($site_empresa){
		return $this->site_empresa = $site_empresa;
	}

	public function getTelefone(){
		return $this->telefone;
	}

	public function setTelefone($telefone){
		return $this->telefone = $telefone;
	}

	public function getCelular(){
		return $this->celular;
	}

	public function setCelular($celular){
		return $this->celular = $celular;
	}

	public function getAdministrador(){
		return $this->nome_administrador;
	}

	public function setAdministrador($nome_administrador){
		return $this->nome_administrador = $nome_administrador;
	}

	public function getCodCidade(){
		return $this->cod_cidade_auto;
	}

	public function getCidade(){

	}

	public function setCodCidade($cod_cidade_auto){
		return $this->cod_cidade_auto = $cod_cidade_auto;
	}

	public function getEndereco(){
		return $this->endereco;
	}

	public function setEndereco($endereco){
		return $this->endereco = $endereco;
	}

	public function getBairro(){
		return $this->bairro;
	}

	public function setBairro($bairro){
		return $this->bairro = $bairro;
	}

	public function getNumero(){
		return $this->numero;
	}

	public function setNumero($numero){
		return $this->numero = $numero;
	}

	public function getCEP(){
		return $this->cep;
	}

	public function setCEP($cep){
		return $this->cep = preg_replace('(\D)', '', $cep);
	}

	public function getCEPFormatted(){
		return UDUtil::mask(str_pad((string)$this->cep, 8, STR_PAD_LEFT), '##.###-###');
	}

	public function getTaxaEntrega(){
		return $this->taxa_entrega;
	}

	public function setTaxaEntrega($taxa_entrega){
		return $this->taxa_entrega = $taxa_entrega;
	}

	public function getCodEmpresa(){
		return $this->cod_empresa_auto;
	}

	public function setSegmentoPrincipal(Segmento $segmento){
		return $this->segmento_principal = $segmento;
	}

	public function getSegmentoPrincipal(){
		return $this->segmento_principal;
	}

	public function addSegmento(Segmento $segmento){
		foreach($this->segmentos as $seg){
			if($segmento->getCodSegmento() == $seg->getCodSegmento()){
				return;
			}
		}

		array_push($this->segmentos, $segmento);
	}

	public function getSegmentos(){
		return $this->segmentos;
	}

	public function getSegmentosDesc(){
		if(!empty($this->segmento_principal)){
			return $this->segmento_principal->getDescSegmento();
		}
	}

	public function addFormaPagto(FormaPagto $forma_pagto){
		foreach($this->formas_pagto as $forma){
			if($forma->getCodFormaAuto() == $forma_pagto->getCodFormaAuto()){
				return;
			}
		}

		array_push($this->formas_pagto, $forma_pagto);
	}

	public function removeAllFormasPagto(){
		$this->formas_pagto = array();
	}

	public function getFormasPagto(){
		return $this->formas_pagto;
	}

	public function getDescFormasPagto(){
		$formas = array();

		foreach($this->formas_pagto as $forma){
			$formas[] = $forma->getDescFormaPagto();
		}
		
		return implode(', ', $formas);
	}

	public function getNome()
	{
		return !isset($this->nome_fantasia) ? $this->getNomeFantasia() : $this->getRazaoSocial();
	}
}